"""
将cookie数据合并到redis中

cookie数据格式　　
        {sku_id: {count:xxx, selected:xxx}.......}
        {1:{count:20, selected:True}, 3:{count: 10, selected:False} .........}

redis数据格式
        hash  {sku_id: count, ........}
         cart_id : {1:20, 2: 15}
        set   [sku_id, sku_id......]
          cart_selected_id : [1, 2]

情况分析
    redis的数据原封不动的保留
    cookie数据要合并到redis数据中：
        １．cookie中含有商品id, redis中没有，将cookie的完全合并进来
        ２．cookie中含有商品id,redis中也有，这时候我们使用cookie中的数据（看产品的需求），替换掉redis中的数据

获取cookie数据
获取redis数据
合并
将更新的数据写入到redis
删除cookie
"""

import base64
import pickle
from django_redis import get_redis_connection


def merge_cookie_to_redis(request, user, response):
    # 获取cookie数据
    cookie_str = request.COOKIES.get('cart')
    #  判断是否为空
    if cookie_str is not None:
        cookie_dict = pickle.loads(base64.b64decode(cookie_str))
        # {1: {count: 20, selected: True}
        # 获取redis数据
        redis_conn = get_redis_connection('carts')
        hash_cart = redis_conn.hgetall('cart_%s' % user.id)
        #  由于从redis中获取的数据是二进制类型，我们需要将数据转换成int
        cart_dict = {}
        for sku_id, count in hash_cart.items():
            cart_dict[int(sku_id)] = int(count)
        # 合并
        #  定义一个列表储存选中状态的id
        selected_ids = []
        for sku_id, count_selected_dict in cookie_dict.items():
                #  判断sku_id是否在对应的cart_dict中
                #                   {1:{count:20, selected:True}
                #  商品id在redis数据里面，我们以cookie为住，修改redis的数据
            #   直接覆盖掉原来的商品信息
            cart_dict[sku_id] = count_selected_dict['count']
            if count_selected_dict['selected']:
                selected_ids.append(sku_id)

        # 将更新的数据写入到redis
        # cart_dict　是最新的数据，直接写入到redis
        redis_conn.hmset('cart_%s' % user.id, cart_dict)
        #  selected_ids　是新增的选中的商品的id
        redis_conn.sadd('cart_selected_%s' % user.id, *selected_ids)
        # 删除cookie
        response.delete_cookie('cart')
        return response
    return response
